798. 得分最高的最小轮调

算法内容

本文件实现 LeetCode 798「得分最高的最小轮调」。旋转后,如果元素值不大于它的新下标,该元素得 1 分,要求返回得分最高且下标最小的旋转值。

代码使用差分数组记录每个元素在哪些旋转区间内可以得分。对位置 i 的元素 nums[i],计算它得分的旋转区间 [low, high),在差分数组中做区间加一;当区间跨过 0 时额外给 diff[0] 加一。最后对差分数组求前缀和,得到每个旋转值的总分,并保留第一次出现的最大值位置。时间复杂度 O(n),空间复杂度 O(n)。

算法实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<vector>
#include<iostream>
#include<stack>
#include<queue>
#include<algorithm>
#include<unordered_map>

using namespace std;

class Solution {
public:
int bestRotation(vector<int>& nums) {
int len = nums.size();
vector<int> diff(len, 0);
for(int i = 0; i < len; i++) {
int low = (i+1)%len, high = (len + i - nums[i] + 1) % len;
diff[low]++;
diff[high]--;
if(low >= high) {
diff[0]++;
}
}
int max = 0;
int cur = 0;
int pos = 0;
for(int i = 0; i < len; i++) {
cur += diff[i];
if(max < cur) {
pos = i;
max = cur;
}
}
return pos;
}
};
作者

Meow Meow Liu

发布于

2022-10-05

更新于

2026-10-19

许可协议

评论